package com.yuntian.mapper;


import com.yuntian.dto.AccountReceivableDTO;
import com.yuntian.dto.InvoiceHeaderDTO;
import com.yuntian.dto.InvoiceOrderDTO;
import com.yuntian.dto.PaymentCustomerDTO;
import com.yuntian.dto.PaymentInvoiceDTO;
import com.yuntian.entity.CustomerMaster;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface OrderMapper {

    /**
     * 根据受注代码获取顾客信息 PR20201
     * M00101 顾客代码
     * M00102 顾客姓名
     * T00104 受注日期
     * M00112 应收余额
     * @param orderId
     * @return
     */
    @Select("select M001.M00101 ,M001.M00102 ,T001.T00104 ,M001.M00112 " +
            "from  M001, T001 " +
            "where M001.M00101 = T001.T00105 and T001.T00101 = #{orderId}")
    CustomerMaster getCustomerById(String orderId);


    /**
     * 获取客户信息和订单信息 PR20101
     */
    AccountReceivableDTO getCustomerAndOrderById(String orderId);

    /** 更新顾客余额（M001.M00112 += amount） */
    int updateAccountReceivableBalance(@Param("customerCode") String customerCode, @Param("amount") Long amount);

    /** 更新受注的纳入日付（T001.T00104） */
    int updateDeliveryDate(@Param("orderCode") String orderCode, @Param("deliveryDate") java.sql.Date deliveryDate);

    /** 获取登记后的余额（M001.M00112） */
    Long selectBalanceAfterRegistration(@Param("orderCode") String orderCode);

    // PR20201：获取需要开票的顾客（已纳入、无发票号）
    List<String> selectCustomersNeedingInvoice();

    // PR20201：按顾客的未开票且已纳入的受注及金额
    java.util.List<InvoiceOrderDTO> selectInvoiceOrdersByCustomer(@Param("customerCode") String customerCode);

    // PR20201：创建发票数据（插入 T003）
    int insertInvoice(@Param("invoiceNo") String invoiceNo, @Param("requestDate") java.sql.Date requestDate);

    // PR20201：为受注设置发票号
    int assignInvoiceNoToCustomerOrders(@Param("customerCode") String customerCode, @Param("invoiceNo") String invoiceNo);

    // PR20201：确认发票号是否存在
    int existsInvoiceNo(@Param("invoiceNo") String invoiceNo);

    // PR20201：获取发票号最大值（用于生成下一个编号）
    String selectMaxInvoiceNo();

    // PR20202：获取发票头信息
    InvoiceHeaderDTO selectInvoiceHeader(@Param("invoiceNo") String invoiceNo);

    // PR20202：获取发票明细（不含税金额）
    List<InvoiceOrderDTO> selectInvoiceOrdersByInvoiceNo(@Param("invoiceNo") String invoiceNo);

    // PR20301：入金対象の顧客コード一覧（請求あり・未入金）
    List<String> selectCustomersNeedingPayment();

    // PR20301：顧客情報（名前と売掛残高）
    PaymentCustomerDTO selectCustomerSummaryByCode(@Param("customerCode") String customerCode);

    // PR20301：未入金の請求一覧（顧客別、税込み金額）
    List<PaymentInvoiceDTO> selectPaymentInvoicesByCustomer(@Param("customerCode") String customerCode);

    // PR20301：入金コードの最大値取得
    String selectMaxPaymentCode();

    // PR20301：入金データ挿入
    int insertPayment(@Param("paymentCode") String paymentCode, @Param("paymentDate") java.sql.Date paymentDate);

    // PR20301：請求へ入金コード設定
    int assignPaymentCodeToInvoice(@Param("invoiceNo") String invoiceNo, @Param("paymentCode") String paymentCode);

    // PR20301：顧客残高減算
    int subtractAccountReceivableBalance(@Param("customerCode") String customerCode, @Param("amount") Long amount);

    // PR20301：入金後残高取得
    Long selectBalanceByCustomerCode(@Param("customerCode") String customerCode);
}
